package cn.consult.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

import java.nio.channels.SocketChannel;

/**
 * @ Author：周xx
 * @ Date：2024-04-10-11:09
 * @ Version：1.0
 * @ Description：
 */
public class NettyServer {


    public static void start() throws InterruptedException {
        //创建BossGroup 和 WorkerGroup
        //创建2个线程组
        //bossGroup只处理连接请求
        //2个都是无限循环
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        //workerGroup 处理客户端的业务逻辑
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        //2.创建服务端的启动对象,可以为服务端启动配置一些服务参数
        ServerBootstrap bootStrap = new ServerBootstrap();

        //2.1使用链式编程来配置服务参数
        bootStrap.group(bossGroup,workerGroup)  //设置2个线程组
                .channel(NioServerSocketChannel.class) //使用NioServerSocketChannel作为服务器的通道
                .option(ChannelOption.SO_BACKLOG,128)            //设置线程等待的连接个数
                .childOption(ChannelOption.SO_KEEPALIVE,Boolean.TRUE) //设置保持活动连接状态
                .childHandler(new BootNettyChannelInitializer<SocketChannel>());
        //给workerGroup 的EventLoop对应的管道设置处理器(可以自定义/也可使用netty的)

        System.err.println("server is ready......");

        //启动服务器，并绑定1个端口且同步生成一个ChannelFuture 对象
        ChannelFuture channelFuture = bootStrap.bind(20010).sync();

        //对关闭通道进行监听(netty异步模型)
        //当通道进行关闭时，才会触发这个关闭动作
        channelFuture.channel().closeFuture().sync();
    }


    public static void main(String[] args) throws InterruptedException {
        //创建BossGroup 和 WorkerGroup
        //创建2个线程组
        //bossGroup只处理连接请求
        //2个都是无限循环
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        //workerGroup 处理客户端的业务逻辑
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        //2.创建服务端的启动对象,可以为服务端启动配置一些服务参数
        ServerBootstrap bootStrap = new ServerBootstrap();

        //2.1使用链式编程来配置服务参数
        bootStrap.group(bossGroup,workerGroup)  //设置2个线程组
                .channel(NioServerSocketChannel.class) //使用NioServerSocketChannel作为服务器的通道
                .option(ChannelOption.SO_BACKLOG,128)            //设置线程等待的连接个数
                .childOption(ChannelOption.SO_KEEPALIVE,Boolean.TRUE) //设置保持活动连接状态
                .childHandler(new BootNettyChannelInitializer<SocketChannel>());
        //给workerGroup 的EventLoop对应的管道设置处理器(可以自定义/也可使用netty的)

        System.err.println("server is ready......");

        //启动服务器，并绑定1个端口且同步生成一个ChannelFuture 对象
        ChannelFuture channelFuture = bootStrap.bind(20010).sync();

        //对关闭通道进行监听(netty异步模型)
        //当通道进行关闭时，才会触发这个关闭动作
        channelFuture.channel().closeFuture().sync();
    }
}
